package com.hedl.practice.diyJava.multithreading.thread_pool.future;

import com.hedl.practice.diyJava.multithreading.thread_pool.future.utils.Task;

import java.math.BigDecimal;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * Runnable接口有个问题，它的方法没有返回值。如果任务需要一个返回结果，那么只能保存到变量，还要提供额外的方法读取，非常不便。所以，Java标准库还提供了一个Callable接口，和Runnable接口比，它多了一个返回值：
 *       class Task implements Callable<String> {
 *           public String call() throws Exception {
 *               return longTimeCalculation();
 *           }
 *       }
 */
public class StudyFuture {
    public static void main(String[] args) throws Exception {
        ExecutorService es = Executors.newFixedThreadPool(4);
        Future<BigDecimal> future = es.submit(new Task("601857"));
        System.out.println(future.get());
        es.shutdown();
    }
}
/**
 * 一个Future<V>接口表示一个未来可能会返回的结果，它定义的方法有：
 *      get()：获取结果（可能会等待）可能阻塞
 *      get(long timeout, TimeUnit unit)：获取结果，但只等待指定的时间；
 *      cancel(boolean mayInterruptIfRunning)：取消当前任务；
 *      isDone()：判断任务是否已完成。
 *
 * 小结:
 *      对线程池提交一个Callable任务，可以获得一个Future对象；
 *      可以用Future在将来某个时刻获取结果。
 */
